perm filename DATCOM.SAI[MUD,SYS] blob
sn#553537 filedate 1981-01-02 generic text, type T, neo UTF8
BEGIN "DATCOM"
Define ! = "comment", crlf = "('15&'12)";
! Compare Dates from PDATA with dates written observed in UFD for given file;
DEFINE UFDMAX = "100000";
DEFINE TLISTFILE ="""PDATA.PDU[MUD,SYS]""", ! files in 7/8 P dump (not known before);
GONELIST ="""FOUND.PDU[MUD,SYS]""", ! files in PDATA not existing now;
CHECKLIST ="""CHECK.PDU[MUD,SYS]""", ! files written since dumped;
IMPROVELIST ="""BETTER.PDU[MUD,SYS]"""; ! files restored unnecessarily old;
DEFINE REAPRV = "'40000000000";
DEFINE UENT = "'20"; ! length of each UFD entry;
DEFINE LH = "'777777000000"; ! mask for left half of word;
PRELOAD_WITH
CVASC("Jan"), CVASC("Feb"), CVASC("Mar"), CVASC("Apr"),
CVASC("May"), CVASC("Jun"), CVASC("Jul"), CVASC("Aug"),
CVASC("Sep"), CVASC("Oct"), CVASC("Nov"), CVASC("Dec");
INTEGER ARRAY MONTHS[0:11];
INTEGER ARRAY UFDINFO[0:5];
INTEGER ARRAY UFDDATA[1:UFDMAX];
INTEGER NCHAN,CCHAN,GCHAN,OCHAN,UCHAN,I,CNT,BRK,EOF,CNTU,BRKU,EOFU,NOENT,NOLOOK;
INTEGER LIN,FIL,MON,FILE,DAY,MONTH,YEAR,PTR;
INTEGER DMPDAT,FILDAT,OPPN,PPN,EXT,UFDLEN;
STRING FILENAM,UFDNAM;
! **** Program starts here ****;
! Enable REA privilege;
IF ( CALL(REAPRV,"SETPRV") LAND REAPRV ) = 0 THEN USERERR(0,1,"No REA priv.");
! Open channel for reading PDATA text;
OPEN(NCHAN←GETCHAN,"DSK",0,19,0,CNT←200,BRK,EOF);
! Open channel for writing gone list;
OPEN(GCHAN←GETCHAN,"DSK",0,0,19,0,0,0);
ENTER(GCHAN,GONELIST,NOENT);
IF NOENT THEN USERERR(0,1,"ENTER failed: " & GONELIST);
! Open channel for writing check list;
OPEN(CCHAN←GETCHAN,"DSK",0,0,19,0,0,0);
ENTER(CCHAN,CHECKLIST,NOENT);
IF NOENT THEN USERERR(0,1,"ENTER failed: " & CHECKLIST);
! Open channel for writing improvable list;
OPEN(OCHAN←GETCHAN,"DSK",0,0,19,0,0,0);
ENTER(OCHAN,IMPROVELIST,NOENT);
IF NOENT THEN USERERR(0,1,"ENTER failed: " & IMPROVELIST);
! Open channel for reading each UFD;
OPEN(UCHAN←GETCHAN,"DSK",'17,19,0,CNTU←200,BRKU,EOFU); ! dump mode;
LOOKUP(NCHAN,TLISTFILE,NOLOOK);
IF NOLOOK THEN USERERR(0,1,"LOOKUP failed: " & TLISTFILE);
SETBREAK(LIN←1,'12,'15&'14,"INS"); ! For reading one line from TLISTFILE;
SETBREAK(FIL←2,";","↓","INS"); ! For scanning filename from line;
SETBREAK(MON←3,"-",'40,"INS"); ! For getting month name, surrounded by hyphens;
OPPN←-1; ! force compare to lose first time;
WHILE ¬EOF DO
BEGIN
FILENAM←INPUT(NCHAN,FIL); ! Get filename from line;
IF NOT FILENAM THEN CONTINUE;
FILE←CVFIL(FILENAM,EXT,PPN); ! Get binary values of filename;
DAY←INTIN(NCHAN); ! Get day of month dumped version was written;
INPUT(NCHAN,MON); ! Skip first hyphen;
MONTH←CVASC(INPUT(NCHAN,MON)); ! Get month name;
YEAR←INTIN(NCHAN)-64; ! Year (since day zero);
DMPDAT←-1;
FOR I←0 STEP 1 UNTIL 11 DO IF MONTH=MONTHS[I] THEN
BEGIN
DMPDAT←YEAR*31*12 + I*31 + DAY - 1; ! system format date;
DONE;
END;
IF DMPDAT < 0 THEN USERERR(0,1,"Illegal month name: " & CVSTR(MONTH));
INPUT(NCHAN,LIN); ! Skip past end of line;
IF PPN ≠ OPPN THEN
BEGIN
OPPN←PPN;
LOOKUP(UCHAN,UFDNAM←CVXSTR(PPN)&".UFD[1,1]",NOLOOK);
IF NOLOOK THEN
BEGIN
USERERR(0,1,"LOOKUP failed: " & UFDNAM);
CONTINUE; ! ignore deleted directory;
END;
FILEINFO(UFDINFO); ! Get length of UFD;
UFDLEN←-((UFDINFO[3] LSH 18) LOR (UFDINFO[3] LSH -18));
IF UFDLEN>UFDMAX THEN USERERR(0,1,"UFD too big: "&CVXSTR(PPN));
ARRYIN(UCHAN,UFDDATA[1],UFDLEN); ! Read whole UFD;
CLOSE(UCHAN);
END;
PTR ← -1;
FOR I ← 1 STEP UENT UNTIL UFDLEN DO
IF (UFDDATA[I] = FILE) AND ( (UFDDATA[I+1] LAND LH) = EXT )
THEN BEGIN PTR ← I; DONE END;
IF PTR < 0 THEN
BEGIN
OUTSTR("Not found: "&
FILENAM&CRLF);
OUT(GCHAN,FILENAM&CRLF);
CONTINUE; ! Go on to next filename in input list;
END;
FILDAT ← ( LDB(POINT(3,UFDDATA[PTR+1],20)) LSH 12 ) LOR
( LDB(POINT(12,UFDDATA[PTR+2],35)) ); ! Date from UFD entry;
IF DMPDAT > FILDAT THEN
BEGIN
OUTSTR("Can improve: " &
FILENAM & " by " &
CVS(DMPDAT-FILDAT) & " days." & CRLF);
OUT(OCHAN,FILENAM&CRLF);
END
ELSE IF DMPDAT = FILDAT THEN
! OUTSTR("Dates match: " & FILENAM & CRLF)
end of comment;
ELSE BEGIN
OUTSTR("Recent file: " & FILENAM & CRLF);
OUT(CCHAN,FILENAM&CRLF);
END;
END;
RELEASE(CCHAN);
RELEASE(GCHAN);
RELEASE(OCHAN);
RELEASE(UCHAN);
RELEASE(NCHAN);
END;